import axios from 'axios';
import { ElMessage, ElMessageBox } from 'element-plus';
import { tansParams } from '@/utils/myUtilsFun';
import { getToken, setToken, removeToken } from '@/utils/auth';
import cache from '@/plugins/cache';
import store from '@/store';
import jwtDecode from 'jwt-decode';
import {
  // 加密密钥
  key,
  // 解密密钥
  // decryptKey,
} from './publickey';
import JSEncrypt from 'jsencrypt';

// 是否显示重新登录
export let isRelogin = { show: false };
let authentication = '';
// 加密函数
const encryptionFun = () => {
  const timer = String(new Date().getTime()); // 获取时间戳
  const jse = new JSEncrypt(); // 创建 JSEncrypt 实例
  jse.setPublicKey(key); // 设置公钥

  // 使用公钥加密时间戳
  const data = jse.encrypt(timer) || null;
  return data;
};

// 解密函数
// const decryptionFun = (data) => {
//   const jse = new JSEncrypt(); // 创建 JSEncrypt 实例
//   jse.setPrivateKey(decryptKey); // 设置私钥
//   const timer = jse.decrypt(data) || ''; // 使用私钥解密
//   return timer;
// };

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';
// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项，表示请求URL公共部分
  baseURL: process.env.VUE_APP_BASE_API,
  // 超时
  timeout: 10000,
});

// request拦截器
service.interceptors.request.use(
  (config) => {
    // 是否需要设置 token
    const isToken = (config.headers || {}).isToken === false;
    // 是否需要防止数据重复提交
    const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
    if (getToken() && !isToken) {
      config.headers['token'] = getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    const timestamp = +new Date();
    authentication = encryptionFun() || '';
    config.headers['Authentication'] = authentication;
    config.headers['Timer'] = timestamp;
    // console.log('密钥解密结果:', decryptionFun(authentication) || '');

    // get请求映射params参数
    if (config.method === 'get' && config.params) {
      let url = config.url + '?' + tansParams(config.params);
      url = url.slice(0, -1);
      config.params = {};
      config.url = url;
    }
    if (
      !isRepeatSubmit &&
      (config.method === 'post' || config.method === 'put')
    ) {
      const requestObj = {
        url: config.url,
        data:
          typeof config.data === 'object'
            ? JSON.stringify(config.data)
            : config.data,
        time: new Date().getTime(),
      };
      const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小
      const limitSize = 5 * 1024 * 1024; // 限制存放数据5M
      if (requestSize >= limitSize) {
        return config;
      }
      const sessionObj = cache.session.getJSON('sessionObj');
      if (
        sessionObj === undefined ||
        sessionObj === null ||
        sessionObj === ''
      ) {
        cache.session.setJSON('sessionObj', requestObj);
      } else {
        cache.session.setJSON('sessionObj', requestObj);
      }
    }
    return config;
  },
  (error) => {
    console.log(error);
    Promise.reject(error);
  },
);

// 响应拦截器
service.interceptors.response.use(
  (res) => {
    let resultData = {};
    // 未设置状态码则默认成功状态
    const code = res.data.code || 20000;
    if (code == 20000) {
      resultData.data = res.data;
      if (res.headers.token) {
        resultData.token = res.headers.token;
        // 服务器token更新
        if (getToken() != res.headers.token) {
          setToken(res.headers.token);
          let userInfo = jwtDecode(res.headers.token);
          store.dispatch('user/changeToken', res.headers.token);
          store.dispatch('user/changeUserInfo', userInfo.data); //将用户信息存储到vuex中 //更新用户数据
        }
      }
      return resultData;
    } else if (code == 40305) {
      // ElMessage({ message: res.msg, type: 'error', duration: 5 * 1000 })
      ElMessageBox.confirm(
        '登录状态已过期，您可以继续留在该页面，或者重新登录',
        '系统提示',
        {
          confirmButtonText: '重新登录',
          cancelButtonText: '取消',
          type: 'warning',
        },
      ).then(() => {
        removeToken();
        location.href = '/login';
      });
    } else if (code == 44444) {
      return res.data;
    }
    // 下载测评报告-资源还未生成-也不能报错
    else if (code == 400333) {
      return res.data;
    } else if (code == 90001) {
      return res;
    } else if (code == 50300) {
      ElMessage.error(res.data.msg);
    } else if (code == 40307) {
      ElMessage.error(res.data.msg);
      removeToken();
      location.href = '/login';
    } else {
      // resultData.data = res.data
      // return resultData
      ElMessage.error(res.data.msg);
    }
  },
  (error) => {
    console.log('err' + error);
    let { message } = error;
    if (message == 'Network Error') {
      message = '后端接口连接异常';
    } else if (message.includes('timeout')) {
      message = '系统接口请求超时';
    } else if (message.includes('Request failed with status code')) {
      message = '系统接口' + message.substr(message.length - 3) + '异常';
    }
    ElMessage({ message: message, type: 'error', duration: 5 * 1000 });
    return Promise.reject(error);
  },
);

export default service;
